package com.fxl.majiang.room;

import com.alibaba.fastjson.JSON;
import com.fxl.majiang.enums.CardTypeEnum;
import com.fxl.majiang.enums.TilesEnum;

import java.util.*;

/**
 * @author fengxinglei
 * @date 2022/8/1 21:44
 * @description 发牌器
 */
public class Dealers {
    // 所有牌
    private static final List<TilesEnum> allTiles = new ArrayList<>();

    // 剩余牌
    private List<TilesEnum> remainingTiles;

    // 百搭牌
    private List<TilesEnum> versatileTiles = new ArrayList<>(2);

    // 每副起手牌数量
    private static int EVERY_STARTING_NUM = 16;

    static {
        initAllTiles();
    }

    // 初始化
    public Dealers(){
        // 首先获取所有牌
        remainingTiles = new ArrayList<>(allTiles);
        // 随机定义两张百搭
        for (int i=0; i<2; i++) {
            versatileTiles.add(getSingle());
        }
        System.err.println(remainingTiles);
        System.err.println(versatileTiles);
    }

    // 是否百搭
    public boolean isVersatile(TilesEnum tile) {
        return versatileTiles.contains(tile);
    }

    /**
     * 初始化所有牌
     */
    private static void initAllTiles() {
        for (TilesEnum tile : TilesEnum.values()) {
            CardTypeEnum type = tile.getType();
            // 万、条、筒、白板、字、风 都是每个添加四张
            if (type == CardTypeEnum.WAN || type == CardTypeEnum.TIAO || type == CardTypeEnum.TONG || type == CardTypeEnum.BAI_BAN) {
                allTiles.add(tile);
                allTiles.add(tile);
                allTiles.add(tile);
                allTiles.add(tile);
            }
            // 其他的就是黑花和百花，各添加一张
            else {
                allTiles.add(tile);
            }
        }

    }

    /**
     * 获取手牌
     * @return
     */
    public synchronized List<TilesEnum> getEveryStarting() {
        List<TilesEnum> tiles = new ArrayList<>();
        for (int i=0; i<EVERY_STARTING_NUM; i++) {
            tiles.add(getSingle());
        }
        return tiles;
    }

    /**
     * 获取单张手牌
     * @return
     */
    public synchronized TilesEnum getSingle() {
        if (remainingTiles.size() == 0) {
            return null;
        }
        int r = new Random().nextInt(remainingTiles.size());
        TilesEnum tile = remainingTiles.get(r);
        remainingTiles.remove(r);
        return tile;
    }

    public List<TilesEnum> getVersatileTiles() {
        return versatileTiles;
    }

    public List<TilesEnum> getRemainingTiles() {
        return remainingTiles;
    }
}
